/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cz.vse.adventura.po1715.xshet00_shevtsova.gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

/*******************************************************************************
 * Instance třídy {@code NabídkaHra} představují nabídku umožňující nastavovat
 * různé možnosti hry, mezi nimi:
 * <ul>
 *   <li>Zobrazení plánku hry</li>
 *   <li>Spuštění zadané hry</li>
 *   <li>Předčasné ukončení hry</li>
 *   <li>Ukončení celé aplikace</li>
 * </ul>
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000
 */
@SuppressWarnings("serial")
class NabídkaHra extends JMenu
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** GUI, pro které nabídka pracuje. */
    private final IMojeGUI gui;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     * @param gui
     */
    NabídkaHra(IMojeGUI gui)
    {
        super("Hra");
        setMnemonic('H');
        this.gui = gui;

        příkazZobrazitPlánek();
        příkazHrátZnovu();
        příkazZadatNovouHru();
        přikazKonecHry();
        příkazKonecAplikace();
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Nastaví, zda se bude či nebude zobrazovat plánek hry
     * s pohybujícím se kurzorem představujícím hráče, který zobrazí místnost,
     * ve které místnosti se hráč právě nachází.
     */
    private void příkazZobrazitPlánek()
    {
        final JCheckBoxMenuItem zobrazitPlánek = new JCheckBoxMenuItem(
                                               "Zobrazovat plánek hry", true);
        zobrazitPlánek.setMnemonic('P');
        gui.setZobrazovatPlánek(gui.getZobrazovatPlánek());
        this.add(zobrazitPlánek);

        zobrazitPlánek.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e)
            {
                gui.setZobrazovatPlánek(zobrazitPlánek.getState());
            }
        });
    }


    /***************************************************************************
     * Spustí aktuální hru znovu od začátku.
     */
    private void příkazHrátZnovu()
    {
        JMenuItem příkaz = new JMenuItem("Hrát znovu stejnou hru");
        příkaz.setMnemonic('Z');
        this.add(příkaz);

        příkaz.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                IGameG hra = ukončiHru();
                gui.startGame(hra);
            }
        });
    }


    /***************************************************************************
     * Nabídne seznam her, z nichž si může hráč vybrat, která se spustí.
     */
    private void příkazZadatNovouHru()
    {
        JMenuItem příkaz = new JMenuItem("Zadat další hru");
        příkaz.setMnemonic('d');
        this.add(příkaz);
        příkaz.setEnabled(false);
    }


    /***************************************************************************
     * Ukončí právě hranou hru.
     */
    private void přikazKonecHry()
    {
        JMenuItem příkaz = new JMenuItem("Ukončit hru");
        příkaz.setMnemonic('U');
        this.add(příkaz);

        příkaz.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                IGameG hra = ukončiHru();
            }
        });
    }


    /***************************************************************************
     * Ukončí celou aplikaci.
     */
    private void příkazKonecAplikace()
    {
        JMenuItem příkaz = new JMenuItem("Konec aplikace");
        příkaz.setMnemonic('K');
        this.add(příkaz);

        příkaz.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                ukončiHru();
                System.exit(0);
            }
        });
    }


    /***************************************************************************
     * Zjistí, která hra je právě ovládána, a pokud ještě není ukončena,
     * tak ji ukončí.
     *
     * @return Odkaz na právě ukončenou hru
     */
    private IGameG ukončiHru()
    {
        IGameG hra = gui.getHra();
        if ((hra != null) && (!hra.isReady())) {
            hra.stop();
        }
        return hra;
    }



//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        NabídkaHra inst = new NabídkaHra();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
